package com.changgou.web.gateway.filter;

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 用户的全局过滤器
 * 实现用户的权限鉴别
 */
@Component
public class AuthorizeFilter  implements GlobalFilter, Ordered {
    private  static final String   AUTHPRIZE_TOKEN="Authorization";
    /**
     * 全局拦截
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        // 获取用户令牌，
        //1.从head头中获取用户令牌z
        String token = request.getHeaders().getFirst(AUTHPRIZE_TOKEN);
         //令牌在有文件中， false 令牌不在头文件中，将令牌封装到头文件中，在传递到其他的微服务
         boolean hasToken = true;
        if (StringUtils.isEmpty(token))
        {
            //2.从参数中获取用户令牌
           token  = request.getQueryParams().getFirst(AUTHPRIZE_TOKEN);
            hasToken=false;
        }
        if (StringUtils.isEmpty(token)){
            //3.从cookie中获取用户信息
            ResponseCookie cookie = response.getCookies().getFirst(AUTHPRIZE_TOKEN);
            if (cookie!=null){
                token=cookie.getValue();
            }
        }

        // 如果没有则拦截
        if (StringUtils.isEmpty(token)){
            //设置没有权限的状态码 401
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            //响应空数据
            return  response.setComplete();
        }else {
            // 如果这个控制请求头中是否有令牌的boolea值为false
            if (!hasToken){
                // 判断当前令牌是否有bearer前缀，如果没有，则添加浅醉Bearer
                if (!token.startsWith("bearer ") && !token.startsWith("Bearer")){
                    // 添加前缀
                    token ="bearer "+token;
                }
                // 将令牌封装到头文件中
                request.mutate().header(AUTHPRIZE_TOKEN, token);
            }
        }

        //放行
        return  chain.filter(exchange);
        // 如果有令牌，则校验令牌是否有效
      /*  try {
            JwtUtil.parseJWT(token);
        } catch (Exception e) {
            e.printStackTrace();
            //设置没有权限的状态码 401
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            //响应空数据
            return  response.setComplete();
        }*/

    }

    /**
     * 排序
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
